ホームに戻る
出典 :
目次 :
レジストリの操作
Microsoft.Win32.Registry および RegistryKey クラスを用いることで、Windowsレジストリの操作を行うことができる。
以下、コードはすべてC#での例。
基本(ルート)キーの取得
以下に記す Microsoft.Win32.Registry の各フィールドには、レジストリの基本キーが読み込まれる。
フィールド |
対応する基本キー |
格納される内容 |
ClassesRoot |
HKEY_CLASSES_ROOT |
ドキュメントの型(またはクラス)と、それらに関連付けられるプロパティ |
CurrentConfig |
HKEY_CURRENT_CONFIG |
各ユーザに共通のハードウェア構成情報 |
CurrentUser |
HKEY_CURRENT_USER |
現在のユーザ設定に関する情報 |
LocalMachine |
HKEY_LOCAL_MACHINE |
ローカルコンピュータの構成データ |
PerformanceData |
HKEY_PERFORMANCE_DATA |
ソフトウェアコンポーネントのパフォーマンス情報 |
Users |
HKEY_USERS |
既定のユーザ構成に関する情報 |
レジストリへの書き込み
RegistryKey.CreateSubKey() メソッドでキーを開き、RegistryKey.SetValue() メソッドで書き込みを行う。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を開く
Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\test\sub");
// 文字列を書き込む ⇒ REG_SZ 型で書き込まれる
regkey.SetValue("string", "StringValue");
// 整数(Int32)を書き込む ⇒ REG_DWORD 型で書き込まれる
regkey.SetValue("int", 100);
// 文字列配列を書き込む ⇒ REG_MULTI_SZ 型で書き込まれる
string[] s = new string[] { "1", "2", "3" };
regkey.SetValue("StringArray", s);
// バイト配列を書き込む ⇒ REG_BINARY 型で書き込まれる
byte[] bs = new byte[] { 0, 1, 2 };
regkey.SetValue("Bytes", bs);
// キーを閉じる
regkey.Close();
結果 : HKEY_CURRENT_USER\Software\test\sub

「(既定)」、「(標準)」に書き込む場合は、SetValue() の第1引数(値の名前)に空文字列か null を指定する。
注意が必要な点
RegistryKey.CreateSubKey() メソッドは、引数で指定されたサブキーが存在しない場合は新たにサブキーを作成する。
新たにキーを作成したくない場合は、RegistryKey.OpenSubKey() メソッドを用いて以下のようにする。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を開く
Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", true);
レジストリへの書き込み(型を指定)
前節のように型を指定せず書き込んだ場合、既定の型が割り当てられる。
(Int32 型整数は REG_DWORD となるが、それ以外の整数は REG_SZ となる。)
SetValue() の第3引数で書き込む型を指定することができる。但し、値が指定された型に適合しない場合はエラーとなる。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を開く
Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\test\sub");
// REG_EXPAND_SZ で書き込む
regkey.SetValue("ExpandString", "%windir%", Microsoft.Win32.RegistryValueKind.ExpandString);
// REG_QWORD で書き込む
regkey.SetValue("QWord", 1000, Microsoft.Win32.RegistryValueKind.QWord);
// キーを閉じる
regkey.Close();
第3引数は Microsoft.Win32.RegistryValueKind で、メンバは以下の通りである。
メンバ |
対応するデータ型 |
格納できる値 |
Binary |
REG_BINARY |
バイナリデータ |
DWord |
REG_DWORD |
32ビットの数値 |
ExpandString |
REG_EXPAND_SZ |
値を取得するときに展開される、環境変数(%PATH%など)を含む文字列 |
MultiString |
REG_MULTI_SZ |
文字列の配列 |
QWord |
REG_QWORD |
64ビットの数値 |
String |
REG_SZ |
文字列 |
Unknown |
- |
サポート外のデータ型。既定値 |
レジストリの読み込み
レジストリの値を読み込む際は、RegistryKey.OpenSubKey() メソッドでキーを開き、RegistryKey.GetValue() メソッドで読み込む。
「(既定)」、「(標準)」を読み込む場合は、GetValue() の第1引数(値の名前)に空文字列か null を指定する。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を読み取り専用で開く
Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false);
// キーが存在しないときは null が返される
if (regkey == null) return;
// 文字列を読み込む
// (指定した名前の値が存在しないときは null が返される)
string stringValue = (string)regkey.GetValue("string");
// キーに値が存在しないときに指定した値を返すようにするには、次のようにする
// (ここでは"default"を返す)
// string stringValue = (string)regkey.GetValue("string", "default");
// 整数を読み込む
int intValue = (int)regkey.GetValue("int");
long longVal = (long)regkey.GetValue("QWord");
// 文字列配列を読み込む
string[] strings = (string[])regkey.GetValue("StringArray");
// バイト配列を読み込む
byte[] bytes = (byte[])regkey.GetValue("Bytes");
// キーを閉じる
regkey.Close();
REG_EXPAND_SZ 型のデータをそのまま取得する
GetValue() の第3引数に Microsoft.Win32.RegistryValueOptions.DoNotExpandEnvironmentNames を指定すると、環境変数を展開せずに値を取得できる。
サブキーと値の名前を取得
キーに存在するすべてのサブキーは RegistryKey.GetSubKeyNames() メソッド、すべての値の名前は RegistryKey.GetValueNames() メソッドで取得できる。
またサブキーおよび値の数は RegistryKey.SubKeyCount() 、RegistryKey.ValueCount() メソッドで取得できる。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を読み取り専用で開く
Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false);
// キーにあるサブキーの数を表示
Console.WriteLine("サブキーの数:{0}", regkey.SubKeyCount);
// キーにあるすべてのサブキー名を表示
string[] keyNames = regkey.GetSubKeyNames();
foreach (string k in keyNames)
{
Console.WriteLine(k);
}
// キーにある値の数を表示
Console.WriteLine("キーの値の数:{0}", regkey.ValueCount);
// キーにあるすべての値の名前を表示
string[] valueNames = regkey.GetValueNames();
foreach (string v in valueNames)
{
Console.WriteLine(v);
}
// キーを閉じる
regkey.Close();
値の種類を取得
RegistryKey.GetValueKind() メソッドで値の種類( RegistryValueKind 列挙体)を取得できる。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を読み取り専用で開く
Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false);
// "string" の値が REG_SZ ならば
// string型として取得する
if( regkey.GetValueKind("string") == Microsoft.Win32.RegistryValueKind.String )
{
string stringValue = (string)regkey.GetValue("string");
}
// キーを閉じる
regkey.Close();
レジストリの削除
キーにある値は RegistryKey.DeleteValue() メソッドで削除できる。
キー自体は RegistryKey.DeleteSubKey() メソッドで削除できるが、指定されたキーがサブキーを持っていると失敗する。
RegistryKey.DeleteSubKeyTree() メソッドを用いると、サブキーの有無を問わず強制的に削除できる。
// キー ( HKEY_CURRENT_USER\Software\test\sub ) を書き込み許可で開く
Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", true);
// "HKEY_CURRENT_USER\Software\test" にある "string" という値を削除する
regkey.DeleteValue("string");
// 次のようにすると指定した値が見つからなくてもエラーが出ない
// regkey.DeleteValue("string", false);
// キー "HKEY_CURRENT_USER\Software\test\sub" を削除する
regkey.DeleteSubKey("sub");
// 次のようにすると指定したキーが見つからなくてもエラーが出ない
// regkey.DeleteSubKey("sub", false);
// キーを閉じる
regkey.Close();
// "HKEY_CURRENT_USER\Software\test" 以下を強制的に削除する
Microsoft.Win32.Registry.CurrentUser.DeleteSubKeyTree(@"Software\test");
静的メソッドを用いた読み書き
静的メソッド Registry.GetValue() 、Registry.SetValue() を用いることでも値の読み書きが可能である。
内部では RegistryKey.OpenSubKey() でキーを開き、値を RegistryKey.GetValue() で取得、または RegistryKey.SetValue() で更新した後 RegistryKey.Close() でキーを閉じている。
一度の手順で簡便に読み書きができる。キーの指定方法が異なる点に注意。
// キー HKEY_CURRENT_USER\Software\test\sub の値 "string" を読み込む
string stringValue = (string)Microsoft.Win32.Registry.GetValue(@"HKEY_CURRENT_USER\Software\test\sub", "string", "default");
// キー HKEY_CURRENT_USER\Software\test\sub の値 "string" を書き込む
Microsoft.Win32.Registry.SetValue(@"HKEY_CURRENT_USER\Software\test\sub", "string", "StringValue");